package entidades;

import util.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.HashMap;
import com.google.gson.Gson;

/**
 * @author JFM
 */
public class Logotipo extends Entidad
	{
	private boolean activo;
	private boolean fantasia;
	private String descripcion;

	static final String NOMBRE_TABLA = "logotipos";


	// --- Constructores --- //

	public Logotipo()
		{
		id = 0;
		activo = true;
		descripcion = "";
		}

	public Logotipo(int id) throws SQLException
		{ super(id); }

	public Logotipo(String id) throws SQLException
		{ super(id); }

	public Logotipo(ResultSet result) throws SQLException
		{ super(result); }

	public Logotipo(ResultSet result, String prefix) throws SQLException
		{ super(result, prefix); }



	// --- Metodos get()/set() --- //

	public String getDescripcion()
		{ return descripcion; }
	public void setDescripcion(String descripcion)
		{ this.descripcion = (descripcion != null)? descripcion : ""; }

	public boolean isFantasia()
		{ return fantasia; }
	public void setFantasia(boolean fantasia)
		{ this.fantasia = fantasia; }
	public void setFantasia(String fantasia)
		{ this.fantasia = fantasia != null && ( fantasia.compareTo("1") == 0 || fantasia.compareTo("true") == 0); }

	public boolean isActivo()
		{ 
                   return activo;
                }
	public void setActivo(boolean activo)
		{ 
                    this.activo = activo;
            }
	public void setActivo(String activo)
		{ this.activo = activo != null && ( activo.compareTo("1") == 0 || activo.compareTo("true") == 0); }

	@Override
	public String getDescriptor()
		{ return descripcion; }

	@Override
	public String toJson()
		{
		HashMap map = new HashMap();
		map.put("id", id);
		map.put("descripcion", descripcion);
		map.put("activo", activo);
		map.put("fantasia", fantasia);
		return new Gson().toJson(map);
		}

	@Override
	public String toString()
		{ return descripcion; }
	
	@Override
	public String getNombreTabla()
		{ return NOMBRE_TABLA; }


	// --- Metodos MySQL --- //

	@Override
	public void leer(ResultSet result, String prefijo) throws SQLException
		{
		this.setId(result.getInt(prefijo + "id"));
		this.setActivo(result.getBoolean(prefijo + "activo"));
		this.setFantasia(result.getBoolean(prefijo + "fantasia"));
		this.setDescripcion(result.getString(prefijo + "descripcion"));
		}

	@Override
	public void guardar() throws SQLException
		{
		ResultSet result = MySQL.executeQuery("Call Logotipos_Save(" +
				MySQL.formatId(id) + "," +
				MySQL.format(descripcion) + "," +
				MySQL.formatBit(activo) + "," +
				MySQL.formatBit(fantasia) + ")");

		if(result.next())
			{
			if( result.getMetaData().getColumnCount() == 1)
				{
				String msj = result.getString("mensaje");
				throw new SQLException(msj);
				}
			else
				{ this.leer(result); }
			}

		result.getStatement().close();
		}

	/**
	 * Devuelve el id del logotipo de nombre 'logotipo'.
	 * Si dicho logotipo no existe, lo crea y lo inserta en la base de datos.
	 * 
	 * @param logotipo El nombre del logotipo
	 * @param fantasia Un booleano que indica si el logotipo es de fantasia o no.
	 * @return El id del logotipo.
	 * @throws SQLException 
	 */
	public static int getId(String logotipo, boolean fantasia) throws SQLException
		{
		int id = 0;
		
		ResultSet res = MySQL.executeQuery("SELECT id FROM " + NOMBRE_TABLA + " WHERE LOWER(descripcion) = " + MySQL.format(logotipo.toLowerCase()) + " AND fantasia = " + MySQL.formatBit(fantasia));
		if(res.next())
			{
			id = res.getInt("id");
			res.getStatement().close();
			}
		else
			{
			res.getStatement().close();
			Logotipo logo = new Logotipo();
			logo.setDescripcion(logotipo);
			logo.setFantasia(fantasia);
			logo.guardar();
			id = logo.getId();
			}
		
		return id;
		}
	
	public static void borrar(String id) throws SQLException
		{ MySQL.executeUpdate("Call Logotipos_Delete("+id+")"); }

	public static List<Logotipo> listar() throws SQLException
		{ return (List) Entidad.listar(Logotipo.class, NOMBRE_TABLA, "descripcion ASC"); }
	}
